#pragma once

#include <quill/Quill.h>

#define LOG_T(FMT, ...) \
    QUILL_LOG_TRACE_L1(quill::get_logger(), FMT, ##__VA_ARGS__)

#define LOG_D(FMT, ...) \
    QUILL_LOG_DEBUG(quill::get_logger(), FMT, ##__VA_ARGS__)

#define LOG_I(FMT, ...) \
    QUILL_LOG_INFO(quill::get_logger(), FMT, ##__VA_ARGS__)

#define LOG_W(FMT, ...) \
    QUILL_LOG_WARNING(quill::get_logger(), FMT, ##__VA_ARGS__)

#define LOG_E(FMT, ...) \
    QUILL_LOG_ERROR(quill::get_logger(), FMT, ##__VA_ARGS__)

#define LOG_C(FMT, ...) \
    QUILL_LOG_CRITICAL(quill::get_logger(), FMT, ##__VA_ARGS__)

#define LOG_T_IF(COND, FMT, ...) \
    do{ if ((COND)) LOG_T(FMT, ##__VA_ARGS__); } while(0)

#define LOG_D_IF(COND, FMT, ...) \
    do{ if ((COND)) LOG_D(FMT, ##__VA_ARGS__); } while(0)

#define LOG_I_IF(COND, FMT, ...) \
    do{ if ((COND)) LOG_I(FMT, ##__VA_ARGS__); } while(0)

#define LOG_W_IF(COND, FMT, ...) \
    do{ if ((COND)) LOG_W(FMT, ##__VA_ARGS__); } while(0)

#define LOG_E_IF(COND, FMT, ...) \
    do{ if ((COND)) LOG_E(FMT, ##__VA_ARGS__); } while(0)

#define LOG_C_IF(COND, FMT, ...) \
    do{ if ((COND)) LOG_C(FMT, ##__VA_ARGS__); } while(0)
